package lambda_expression.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * Stream中常见的API操作
 */
public class StreamApiTest2 {
    public static void main(String[] args) {
        List<String> users = new ArrayList<String>(){
            {
                add("及时雨宋江");
                add("花和尚鲁智深");
                add("豹子头林冲");
                add("托塔天王晁盖");
            }
        };
        // map -
//        users = users.stream().map(x -> "梁山好汉:" + x).collect(Collectors.toList());
        // filter - 过滤
//        users = users.stream().filter(x -> x.length() > 5).collect(Collectors.toList());
        // peek - 中间操作，迭代数据完成数据的一次处理过程
        users.stream()
                .peek(x -> System.out.println("--peek-1--" + x))
                .peek(x -> System.out.println("--peek-2--" + x))
                .forEach(System.out::println);

        System.out.println("=========");
        users.forEach(System.out::println);


        /////////////// Stream对于数字运算的支持 ///////////////
        List<Integer> nums = new ArrayList<Integer>(){
            {
                add(100);
                add(200);
                add(100);
                add(300);
                add(400);
                add(100);
                add(200);
                add(100);
            }
        };
        // 需求：只读取300，400这两个数
        // skip：中间操作，有状态，跳过部分数据
        // limit：中间操作，有状态，限制输出数据量
        nums.stream()
                .skip(3)
                .limit(2)
                .forEach(System.out::println);
        System.out.println("-----distinct----------------");
        // distinct：中间操作，有状态，剔除重复数据
        nums.stream()
                .distinct()
                .forEach(System.out::println);
        System.out.println("--------sorted-------------");
        // sorted 排序
        nums.stream()
                .sorted((x,y) -> y-x) // sorted()默认升序
                .forEach(System.out::println);
        // max 获取最大值
        System.out.println("----------max-----------");
        Optional<Integer> op = nums.stream()
                .max((x,y) -> x-y);
        System.out.println(op.get());
        System.out.println("--------min-------------");
        // min 获取最小值
        Optional<Integer> op2 = nums.stream()
                .min((x,y) -> x-y);
        System.out.println(op2.get());
        System.out.println("--------reduce-------------");
        // reduce 合并处理数据
        Optional<Integer> op3 = nums.stream()
                .reduce((x,y) -> x+y);
        System.out.println(op3.get()); // sum = 1500

    }
}
